﻿using System;
using System.Windows.Forms;
using Belmost4PDA.Fasade;

namespace Belmost4PDA.Logic
{
    public abstract class  defControlStrategy
    {
        protected bool isChecked = false;
        public string Value = "0";
        protected bool _isChecked = false;
        protected string _Value = "0";
        public brDef defItem;
        public string GroupID = "-1";
        public abstract void AddToForm(Form _form); // втсавка контролов на форму
        public abstract void FromControls(); // данные из контролов перекочевывают в isChecked и Value
        protected defControlStrategy(brDef brDefItem)
        {
            defItem = brDefItem;
            GroupID = brDefItem.DefItem.rootDef;
        }
        public void Post(DefectsReader.brDefItem item)
        {
            FromControls();
            try
            {
                Convert.ToDouble(Value.Replace('.',','));
            }
            catch (FormatException)
            {
                Value = "0";
            }
            // тут надо проверить необходимость 
            if (_Value.LastIndexOf('.') != -1)
                _Value = _Value.TrimEnd('0');
            _Value=_Value.TrimEnd('.');
            if (Value.LastIndexOf('.') != -1)
                Value = Value.TrimEnd('0');
            Value=Value.TrimEnd('.');
            if ((_Value != Value) || (isChecked != _isChecked))
            {
                LogRecord log = new LogRecord();
                log.sqlText = DefectsReader.UpdateDef(item.idBrDef, isChecked, Value.Replace(",","."));
                log.idBr = GlobalStates.IDBR;
                log.SetCurrRunDate();
                log.logType = LogRecord.LogType.BrDefUpdate;
                log.tableName = "BrDef";
                log.tableDescr = "Дефект";
                if(_Value!=Value)
                {
                    LogRecordDetail det = new LogRecordDetail();
                    det.fieldName = "defScope";
                    det.fieldDescr = "Объем";
                    det.valueOld = _Value.Replace('.', ',');
                    det.valueNew = Value.Replace('.', ',');
                    log.detailRecords.Add(det);
                }
                if (_isChecked != isChecked)
                {
                    LogRecordDetail det = new LogRecordDetail();
                    det.fieldName = "defOn";
                    det.fieldDescr = "Выбрано";
                    det.valueOld = _isChecked.ToString();
                    det.valueNew = isChecked.ToString();
                    log.detailRecords.Add(det);
                }
                if(log.detailRecords.Count>0)
                    log.Save();
                // создаем итем с описание что происходит
            }
        }
        public abstract void OnChange(defControlStrategy args); // обработка изменения в контроле (включения контрола и только включения)


        public static defControlStrategy GetStraregy(DefectsReader.brDefItem item, DefectsReader.DefItem defItem, brDef brDefItem)
        {
            // выдает соответствующую стратегию работы с контролами
            if(defItem.isRadio)
            {
                if(defItem.clsDefUn!=0)
                {
                    return new defStrategyRadioEdit(item, defItem, brDefItem);
                }
                else
                {
                    return new defStrategyRadio(item, defItem, brDefItem);
                }
            }
            else
            {
                if (defItem.clsDefUn != 0)
                {
                    return new defStrategyCheckEdit(item, defItem, brDefItem);
                }
                else
                {
                    return new defStrategyCheck(item, defItem, brDefItem);
                }                
            }
        }
        protected void checkbox_CheckStateChanged(object sender, EventArgs e)
        {
            if (((CheckBox)sender).Checked)
            {
                brDef.Changed(this);
            }
            if(((CheckBox)sender).Checked)
            {
                afterCheckOn();
            }
            else
            {
                afterCheckOff();
            }
        }

        public virtual void CheckOff()
        {
            // do nothing
        }

        public virtual void afterCheckOff()
        {
            // do nothing
        }
        public virtual void afterCheckOn()
        {
            // do nothing
        }
    }
}
